package main

import "fmt"

func main() {
	names := []string{"wangheng", "test"}
	for _, v := range names {
		fmt.Println(v)
	}
	fmt.Println(max(1, 2))
	fmt.Println(swap(12, 312))
	var x = 12
	var y = 12213
	swapAddress(&x, &y)
	fmt.Println(x, y)

	// 数组的定义方式
	var arr [2]int
	fmt.Println(arr)

	var balance = [3]float32{0.1, 0.2, 0.3}
	fmt.Println(balance)

	balance2 := [4]float32{0.1, 0.23, 0.13, 0.12321}
	fmt.Println(balance2)

	// 数组长度不确定
	balance3 := [...]float32{0.1}
	fmt.Println(balance3)

	// 指定下标初始化元素
	balance4 := [...]float32{1: 0.8, 5: 0.9}
	fmt.Println(balance4)

	// 访问数组元素
	var salary float32 = balance[1]
	fmt.Println(salary)

	// 声明长度为10的数组
	// var balance5 [10]int
	// for i := 0; i < 10; i++ {
	// 	balance5[i] = i + 100
	// }
	// for _, v := range balance5 {
	// 	fmt.Println(v)
	// }

	// 声明数组的同时快速初始化数组
	var balance6 = [6]int{1, 2, 23, 123, 14}
	balance6[5] = 8
	fmt.Println(balance6)

	// 二维数组定义
	var balance7 [8][2]int
	for k, _ := range balance7 {
		for i := 0; i < 2; i++ {
			if k != 0 && i == 0 {
				balance7[k][i] = 1 + balance7[k-1][i+1]
			} else if k != 0 && i == 1 {
				balance7[k][i] = 1 + balance7[k][i-1]
			} else {
				balance7[k][i] = 1 + balance7[k][i]
			}
		}
	}
	fmt.Println(balance7)

	// 访问二维数组
	arr1 := balance7[2][1]
	fmt.Println(arr1)

	// 向函数传递数组
	getArr(balance7)

	// 求平均数
	avg := getAvg(balance7)
	fmt.Println(avg)

	// 浮点数精度问题
	a := 1.54
	b := 1.32
	sum := getSumByFloat(a, b)
	fmt.Println(sum)

	// 获取一个变量的内存地址
	address := 10
	fmt.Println(&address)

	// 声明一个指针
	var ip *int
	ip = &address
	fmt.Println(ip)

	// 使用指针访问值
	fmt.Println(*ip)

	// 定义一个空指针
	var nullip *string
	fmt.Println(nullip)

	// 指针数组
	var arr2 = [...]int{1, 23, 123, 14, 123, 14}
	var address2 [6]*int
	for k, _ := range arr2 {
		address2[k] = &arr2[k]
	}
	for _, v := range address2 {
		fmt.Println(*v)
	}

	// 指向指针的指针
	var a2 = 3000
	a2address := &a2
	addressa2 := &a2address
	fmt.Println(**addressa2)

	// 指针作为函数参数 交换两个变量
	a3 := 1
	b3 := 2
	swapAddress2(&a3, &b3)
}

// 使用指针交换两者的值
func swapAddress2(a *int, b *int) {
	var temp = *a
	fmt.Println(*a, &a, a)
	*a = *b
	*b = temp
}

func getSumByFloat(a, b float64) float64 {
	// return a + b
	// 设定固定精度
	a = a * 1000
	b = b * 1000
	return float64(a+b) / 1000
}

func getAvg(avg [8][2]int) int {
	var sum int
	var count int
	for _, v := range avg {
		for i := 0; i <= 1; i++ {
			sum += v[i]
			count++
		}
	}
	return sum / count
}

func getArr(params [8][2]int) {
	fmt.Println(params)
}

// 返回一个最大值
func max(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

// 函数返回多个值
func swap(x, y int) (int, int) {
	return x, y
}

// 地址交换
func swapAddress(x *int, y *int) {
	var temp = *y
	*y = *x
	*x = temp
}
